//package cn.icatw.blog.service.impl;
//
//import cn.dev33.satoken.session.SaSession;
//import cn.dev33.satoken.stp.StpUtil;
//import cn.hutool.core.util.StrUtil;
//import cn.icatw.blog.domain.UserInfo;
//import cn.icatw.blog.domain.UserRole;
//import cn.icatw.blog.dto.UserDetailDTO;
//import cn.icatw.blog.dto.UserOnlineDTO;
//import cn.icatw.blog.enums.FilePathEnum;
//import cn.icatw.blog.excetion.BizException;
//import cn.icatw.blog.mapper.UserInfoMapper;
//import cn.icatw.blog.params.ConditionParams;
//import cn.icatw.blog.service.RedisService;
//import cn.icatw.blog.service.UserInfoService;
//import cn.icatw.blog.service.UserRoleService;
//import cn.icatw.blog.strategy.context.UploadStrategyContext;
//import cn.icatw.blog.utils.BeanCopyUtil;
//import cn.icatw.blog.utils.PageUtil;
//import cn.icatw.blog.vo.*;
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
//import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
//import jakarta.annotation.Resource;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.stereotype.Service;
//import org.springframework.transaction.annotation.Transactional;
//import org.springframework.web.multipart.MultipartFile;
//
//import java.util.ArrayList;
//import java.util.List;
//import java.util.stream.Collectors;
//
//import static cn.icatw.blog.constant.RedisPrefixConst.USER_CODE_KEY;
//import static cn.icatw.blog.constant.UserInfoConstant.USER_INFO;
//
///**
// * (UserInfo)表服务实现类
// *
// * @author icatw
// * @since 2024-03-21 11:22:21
// */
//@Service("userInfoService")
//@Slf4j
//public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo> implements UserInfoService {
//    @Resource
//    UploadStrategyContext uploadStrategyContext;
//    @Resource
//    RedisService redisService;
//    @Resource
//    UserRoleService userRoleService;
//
//    @Override
//    public PageResult<UserOnlineDTO> listOnlineUsers(ConditionParams conditionVO) {
//        //sa-token获取在线用户列表
//        List<UserOnlineDTO> list = new ArrayList<>();
//        // 获取所有登录的用户ids
//        List<String> logIds = StpUtil.searchSessionId("", 0, -1, false);
//        // 便利获取登录信息
//        SaSession session;
//        for (String logId : logIds) {
//            session = StpUtil.getSessionBySessionId(logId);
//
//            UserDetailDTO userDetailDto = session.getModel(USER_INFO, UserDetailDTO.class);
//            if (StrUtil.isBlank(conditionVO.getKeywords()) || StrUtil.contains(userDetailDto.getNickname(), conditionVO.getKeywords())) {
//                list.add(BeanCopyUtil.copyProperties(userDetailDto, UserOnlineDTO.class));
//            }
//        }
//        // 执行分页
//        int fromIndex = PageUtil.getLimitCurrent().intValue();
//        int size = PageUtil.getSize().intValue();
//        int toIndex = list.size() - fromIndex > size ? fromIndex + size : list.size();
//        list = list.subList(fromIndex, toIndex);
//        return new PageResult<>(list, logIds.size());
//    }
//
//    @Override
//    public void removeOnlineUser(Integer userInfoId) {
//        //sa-token获取在线用户列表
//        List<UserDetailDTO> list = new ArrayList<>();
//        List<String> logIds = StpUtil.searchSessionId("", 0, -1, false);
//        // 便利获取登录信息
//        SaSession session;
//        for (String logId : logIds) {
//            session = StpUtil.getSessionBySessionId(logId);
//            UserDetailDTO userDetailDto = session.getModel(USER_INFO, UserDetailDTO.class);
//            list.add(userDetailDto);
//        }
//        for (UserDetailDTO userDetailDTO : list) {
//            if (userInfoId.equals(userDetailDTO.getUserId())) {
//                log.info("踢下线： {}", userDetailDTO);
//                StpUtil.logout(userDetailDTO.getUserId());
//            }
//        }
//    }
//
//
//    @Transactional(rollbackFor = Exception.class)
//    @Override
//    public void updateUserInfo(UserInfoVO userInfoVO) {
//        log.info("loginId = {} 更改用户信息", StpUtil.getLoginId());
//        UserDetailDTO userDetailDTO = (UserDetailDTO) StpUtil.getSession().get(USER_INFO);
//        // 封装用户信息
//        UserInfo userInfo = UserInfo.builder()
//                .id(userDetailDTO.getUserId())
//                .nickname(userInfoVO.getNickname())
//                .intro(userInfoVO.getIntro())
//                .webSite(userInfoVO.getWebSite())
//                .build();
//        baseMapper.updateById(userInfo);
//    }
//
//    @Transactional(rollbackFor = Exception.class)
//    @Override
//    public String updateUserAvatar(MultipartFile file) {
//        log.info("loginId = {} 更改用户头像", StpUtil.getLoginId());
//        // 头像上传
//        String avatar = uploadStrategyContext.executeUploadStrategy(file, FilePathEnum.AVATAR.getPath());
//        UserDetailDTO userDetailDTO = (UserDetailDTO) StpUtil.getSession().get(USER_INFO);
//        // 更新用户信息
//        UserInfo userInfo = UserInfo.builder()
//                .id(userDetailDTO.getUserId())
//                .avatar(avatar)
//                .build();
//        baseMapper.updateById(userInfo);
//        return avatar;
//    }
//
//    @Transactional(rollbackFor = Exception.class)
//    @Override
//    public void saveUserEmail(EmailVO emailVO) {
//        log.info("loginId = {} 更改用户邮箱", StpUtil.getLoginId());
//        UserDetailDTO userDetailDTO = (UserDetailDTO) StpUtil.getSession().get(USER_INFO);
//        if (!emailVO.getCode().equals(redisService.get(USER_CODE_KEY + emailVO.getEmail()).toString())) {
//            throw new BizException("验证码错误！");
//        }
//        UserInfo userInfo = UserInfo.builder()
//                .id(userDetailDTO.get())
//                .email(emailVO.getEmail())
//                .build();
//        baseMapper.updateById(userInfo);
//    }
//
//    @Transactional(rollbackFor = Exception.class)
//    @Override
//    public void updateUserRole(UserRoleVO userRoleVO) {
//        // 更新用户角色和昵称
//        UserInfo userInfo = UserInfo.builder()
//                .id(userRoleVO.getUserInfoId())
//                .nickname(userRoleVO.getNickname())
//                .build();
//        baseMapper.updateById(userInfo);
//        // 删除用户角色重新添加
//        userRoleService.remove(new LambdaQueryWrapper<UserRole>()
//                .eq(UserRole::getUserId, userRoleVO.getUserInfoId()));
//        List<UserRole> userRoleList = userRoleVO.getRoleIdList().stream()
//                .map(roleId -> UserRole.builder()
//                        .roleId(roleId)
//                        .userId(userRoleVO.getUserInfoId())
//                        .build())
//                .collect(Collectors.toList());
//        userRoleService.saveBatch(userRoleList);
//    }
//
//    @Transactional(rollbackFor = Exception.class)
//    @Override
//    public void updateUserDisable(UserDisableVO userDisableVO) {
//        // 更新用户禁用状态
//        UserInfo userInfo = UserInfo.builder()
//                .id(userDisableVO.getId())
//                .isDisable(userDisableVO.getIsDisable())
//                .build();
//        baseMapper.updateById(userInfo);
//    }
//
//}
//
